package singleton.lazy;

/**
 * 线程安全（双重检查同步延迟加载）
 *
 * 双重检查的破坏
 * 指令重排序
 * //3可拆分为  a.分配对象所需空间;b.初始化引用的对象;c.对象引用写入共享变量
 * 有可能c在b前执行了，这样某个线程可能获取到不为null但未初始化完成的instance
 */
public class Singleton5 {
    private Singleton5(){}
    private static Singleton5 instance;

    public static Singleton5 getInstance() {
        if(null == instance){
            synchronized (Singleton5.class) { //1
                if(null == instance) { //2
                    instance = new Singleton5(); //3
                }
            }
        }
        return instance;
    }
}
